package com.hb.core.pojo.sync;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db;
import cn.hutool.db.DbUtil;
import cn.hutool.db.meta.MetaUtil;
import cn.hutool.log.level.Level;
import com.baomidou.mybatisplus.annotation.TableName;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.List;
import java.util.Scanner;
import java.util.Set;

/**
 * 删除与本项目实体类不对应的表
 */
public class DropTableOperation {

    public static void main(String[] args) {
        // 数据源对象
        DataSource dataSource = DataSourceBuilder.buildDefault();

        // 所有表名
        List<String> tableNames = MetaUtil.getTables(dataSource);
        DbUtil.setShowSqlGlobal(false, false, false, Level.INFO);

        // 数据库操作工具
        Db db = Db.use(dataSource);

        // 扫描所有的实体类
        Set<Class<?>> classes = ClassUtil.scanPackage("com.hb.core.pojo", (item) -> {
            Package aPackage = item.getPackage();
            return aPackage.getName().endsWith("entity");
        });

        for (Class<?> aClass : classes) {
            // 获取类名
            String simpleName = aClass.getSimpleName();

            // mybatis-plus注解
            TableName annotation = aClass.getAnnotation(TableName.class);
            String tableName;
            if (annotation == null) {
                // 没有注解的默认为将类名改为下划线分割的作为表名
                tableName = StrUtil.toUnderlineCase(simpleName);
            } else {
                tableName = annotation.value();
            }
            tableNames.remove(tableName);
        }

        if (CollUtil.isEmpty(tableNames)) {
            return;
        }

        System.out.println("以下表将被删除...");
        System.out.println(tableNames);
        System.out.println("即将进行删除表操作, 输入[Y]进行确认, 输入任意值退出程序....");
        Scanner scanner = new Scanner(System.in);
        String next = scanner.next();
        if (!"Y".equals(next)) {
            System.out.println("操作取消 !");
            return;
        }

        String dropSql = "drop table ";
        for (String tableName : tableNames) {
            System.out.print("移除表: " + tableName);
            try {
                db.execute(dropSql + tableName);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println("...成功");
        }
        System.out.println(">>>>>>>>>>>>>>>>处理完成 !");
    }
}
